package com.itany.corejava.code14_lambda;

import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年12月14日 17:03
 */
public class Test06_方法的引用 {
    public static void main(String[] args) {

        // 匿名内部类->Lambda表达式->方法引用
        // 对象::实例方法名
        // 类::静态方法名
        // 类::实例方法名
        User user = new User();

        //匿名内部类
        // Consumer<String> consumer = new Consumer<String>() {
        //     @Override
        //     public void accept(String s) {
        //         user.setUsername(s);
        //     }
        // };
        // consumer.accept("alice");
        // System.out.println(user.getUsername());


        // Lambda表达式
        // Consumer<String> consumer2=s->user.setUsername(s);
        // consumer2.accept("huahua");
        // System.out.println(user.getUsername());

        // 对象::setUsername
        // 实例的方法的返回和对应的函数式接口的返回值需要保持一致
        Consumer<String> consumer3=user::setUsername;
        consumer3.accept("aaaa");
        System.out.println(user.getUsername());

        //getUsername是无参的有返回值的方法，需要选择一个无参又返回值的函数式接口
        Supplier<String> s=user::getUsername;
        System.out.println(s.get());


        Consumer<String> c=new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        c.accept("我是打印出来的数据");

        Consumer<String> c2=strs-> System.out.println(strs);
        c2.accept("我是打印出来的数据2");

        Consumer<String> c3=System.out::println;
        c3.accept("我是打印出来的数据3");



        // System.out.println(User.hello());
        // Supplier<String> ss=new Supplier<String>() {
        //     @Override
        //     public String get() {
        //         return User.hello();
        //     }
        // };

        // Supplier<String> sss=()->User.hello();
        // System.out.println(sss.get());

        //类::静态方法名
        Supplier<String> s2=User::hello;
        System.out.println(s2.get());

        // 类::实例方法名
        Predicate<String> p=new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.equals("admin");
            }
        };
        System.out.println( p.test("admin"));

        // Predicate<String> p2=str-> str.equals("admin");
        // System.out.println(p2.test("aaaa"));

        Predicate<String> p2="abc"::equals;
        System.out.println(p2.test("abc"));


        // JDK8中提供BiPredicate类型，专门用于处理类似的操作
        // 此时的两个泛型分别对应方法调用者与方法的参数
        // 第一个泛型表示调用方法的调用者类型
        // 第二个泛型方法参数的类型
        BiPredicate<String,String> p3=String::equals;
        System.out.println(p3.test("aa","aa"));




    }
}
